#ifndef	_THREADPOOL_H_
#define	_THREADPOOL_H_

#include <condition.h>
#include <stdbool.h>
#include <stdint.h>

//任务结构体，将任务放入队列中由线程池的线程来执行
typedef struct task
{
	void *(*run)(void *arg);	//任务回调函数
	void *arg;			//回调函数参数
	struct task *next;
} task_t;

//线程池结构体
typedef	struct threadpool
{
	condition_t ready;	//任务准备就绪或者线程池销毁通知
	task_t *first;		//任务队列头指针
	task_t *last;		//任务队列尾指针
	int counter;		//线程池当中当前线程数
	int idle;		//线程池中当前正在等待任务的线程数
	int max_threads;	//线程池中最大允许的线程数
	int quit;		//销毁线程池的时候置1
} threadpool_t;

//初始化线程池
void threadpool_init(threadpool_t *pool,int threads);
//往线程池中添加任务
void threadpool_add_task(threadpool_t *pool,void *(*run)(void *arg),void *arg);
//销毁线程池
void threadpool_destroy(threadpool_t *pool);
//建立一个仓库机制和线程数匹配，主要用途是为每个线程
//传入的任务分配一个唯一的内存空间，减少原来为了防止
//临界资源问题而每次分配内存复制数据的情况。
void threadpool_task_mem_pool_init(int32_t threads,uint32_t single_task_len);
//获取一块内存用来存放任务数据
void *threadpool_malloc_task_mem(void);
//释放使用的内存
bool threadpool_free_task_mem(void *task_mem);
//释放这个内存仓库
void threadpool_task_mem_pool_destroy(void);

#endif

